/**
 * 抽象类是类（事物）的抽象，抽象类用来捕捉子类的通用特性，接口是行为的抽象
  接口可以被多层实现，而抽象类只能单一继承
  接口不具备继承的任何具体特点，仅仅承诺了能够调用的方法
  抽象类更多的定义是在一系列紧密相关的类之间，而接口大多数是定义在关系疏松但都实现某一功能的类中

  总结：
抽象类是对类本质的抽象，表达的是 is a 的关系。比如：male is a Human。抽象类包含并实现子类的通用特性，将子类存在差异化的特性进行抽象，交由子类去实现。
接口是对行为的抽象，表达的是 like a 的关系。比如：Baoma like a plane（它有飞的功能一样可以飞），但其本质上 is a Car。接口的核心是定义行为，即实现类可以做什么，至于实现类主体是谁、是如何实现的，接口并不关心
 */

abstract class Human {
  public head;
  public foot;
  public hand;
  // 已实现的方法
  sleep() {
    return '睡觉'
  }
  // 未实现的方法
  abstract toilet();
}

class Male extends Human {
  toilet() {
    return '上男厕所'
  }
}

class Female extends Human {
  toilet() {
    return '上女厕所'
  }
}

interface plane{
  fly(): string
}

interface waterWay{
  waterWay(): string
}

class Baoma implements plane, waterWay{
  fly(): string {
    return "宝马实现了飞的技术"
  }
  waterWay(): string {
    return "宝马实现了水路技术"
  }
}